import java.util.ArrayList;

/**
 * @author LKQ
 * @date 2021/11/27 20:55
 * @description 判断是否为回文数，-2^31 <= x <= 2^31-1
 */
public class Palindrome {
    public static void main(String[] args) {
        System.out.println(isPalindrome(121121));
    }

    public static boolean isPalindrome(int x) {
        return judgeByInt(x);
    }

    public static boolean judgeByString(int x) {
        StringBuffer sb = new StringBuffer(String.valueOf(x));
        String normal = sb.reverse().toString();
        return String.valueOf(x).equals(normal);
    }

    public static boolean judgeByArrayList(int x) {
        ArrayList<Integer> list = new ArrayList<>();
        int temp = x;
        if (x==0) {
            return true;
        }else if (x < 0) {
            return false;
        }else {
            while (x>0) {
                list.add(x % 10);
                x /= 10;
            }
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                sb.append(list.get(i));
            }
            return String.valueOf(temp).equals(sb.toString());
        }
    }

    public static boolean judgeByArray(int x) {
        boolean ans = true;
        if (x == 0) {
            ans = true;
        }else if (x < 0) {
            ans =  false;
        }else {
            ArrayList<Integer> list = new ArrayList<>();
            while (x > 0) {
                list.add(x % 10);
                x /= 10;
            }
            Object[] a = list.toArray();
            for (int i = 0; i < a.length ; i++) {
                if (!a[i].equals(a[a.length-i-1])) {
                    ans =  false;
                }
            }
        }
        return ans;
    }

    public static boolean judgeByInt(int x) {
        // 通过数本身来判断回文数，首先分为三种情况，1. 负数一定不是回文数，如-121 -> 121-，前后两次并不相等。
        // 2. 0一定是回文数； 3. 正数中，a(能整除10的一定不是回文数，如120 -> 021)；其他正数才需要判断
        if ( x < 0 || ( x % 10 == 0 && x!=0)) {
            // 排除1和3.a情况
            return false;
        }
        // 对于正数，如果将数完全倒过来，那么可能还会出现溢出的情况，如2^31-1 = 2147483647 - > 7463847412，如果反转全部数字，
        // 则需要用double存储，但是判断是否为回文数，只需要反转一半的数字即可，如12321，奇数个数字，则反转 21-> 12；1221，偶数个，也反转21
        // 条件就是 x < reverseNumber
        int reverseNumber = 0;
        while( x > reverseNumber) {
            reverseNumber = reverseNumber *10 +(x % 10) ;
            x /= 10;
        }
        // 对于奇数，最后x=12 reverseNumber= 123, 对于偶数，x=12, reverseNumber = 12, 如果两者两者之一相等，那么判断是回文;
        return x==reverseNumber || x==reverseNumber/10;
    }

}
